package net.lzzy.practices.web.course;

import net.lzzy.practices.constants.ApiConstant;
import net.lzzy.practices.constants.Messages;
import net.lzzy.practices.entities.Course;
import net.lzzy.practices.entities.User;
import net.lzzy.practices.services.CourseService;
import net.lzzy.practices.services.UserService;
import net.lzzy.practices.utils.StringUtils;
import net.lzzy.practices.web.models.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @author hzl on 2022/5/20.
 * Description:
 */
@CrossOrigin
@RestController
@RequestMapping(ApiConstant.ROUTE_COURSE_ROOT)
public class CourseApiController {
    @Autowired
    public CourseApiController(CourseService service, UserService uService) {
        this.service = service;
        this.uService = uService;
    }

    private final CourseService service;
    private final UserService uService ;

    @GetMapping(ApiConstant.ROUTE_COURSE_All)
    public ApiResult getCourses(@RequestParam String token){
        List<VmCourse> courses=new ArrayList<>();
        service.get().forEach(course -> courses.add(VmCourse.create(course,false)));
        return new ApiResult(true,courses.size()+"",courses);
    }

    @GetMapping(ApiConstant.ROUTE_COURSE_OPEN)
    public ApiResult getOpenCourses(@RequestParam String token){
        List<VmCourse> courses=new ArrayList<>();
        service.get(true).forEach(course -> courses.add(VmCourse.create(course,false)));
        return new ApiResult(true,courses.size()+"",courses);
    }

    @GetMapping(ApiConstant.ROUTE_COURSE_PAGE)
    public ApiResult getPagedCourses(@RequestParam String token,@RequestParam int page,@RequestParam int size){
        List<VmCourse> courses=new ArrayList<>();
        service.get(page, size).forEach(course -> courses.add(VmCourse.create(course,false)));
        return new ApiResult(true,courses.size()+"",courses);
    }


    @GetMapping(ApiConstant.ROUTE_COURSE_OPEN_PAGE)
    public ApiResult getPagedOpenCourses(@RequestParam String token,@RequestParam int page,@RequestParam int size){
        List<VmCourse> courses=new ArrayList<>();
        service.get( page, size,true).forEach(course -> courses.add(VmCourse.create(course,false)));
        return new ApiResult(true,courses.size()+"",courses);
    }

    @GetMapping(ApiConstant.ROUTE_COURSE_TEACHER)
    public ApiResult getTeachersCourses(@RequestParam String token, @RequestParam(name = "id")UUID teacherId){
        List<VmCourse> courses=new ArrayList<>();
        service.getTeachersCourses(teacherId).forEach(course -> courses.add(VmCourse.create(course,true)));
        return new ApiResult(true,courses.size()+"",courses);
    }

    @GetMapping(ApiConstant.ROUTE_COURSE_STUDENT)
    public ApiResult getStudentsCourses(@RequestParam String token, @RequestParam(name = "id")UUID studentId){
        List<VmCourse> courses=new ArrayList<>();
        service.getStudentsCourses(studentId).forEach(course -> courses.add(VmCourse.create(course,false)));
        return new ApiResult(true,courses.size()+"",courses);
    }

    @PostMapping(value = ApiConstant.ROUTE_COURSE_ADD,produces ="application/json",consumes ="application/json" )
    public ApiResult add(@RequestBody CourseInfo info){
//        String name=info.getName();
//        String desc=info.getDesc();
//        String cover=info.getCover();
//        String teacherId=info.getTid();
//        boolean open=info.isOpen();
//        if (StringUtils.isEmpty(name)||
//        StringUtils.isEmpty(desc)||
//        StringUtils.isEmpty(cover)||
//        StringUtils.isEmpty(teacherId)){
//            return new ApiResult(false, Messages.INCOMPLETE_INFO.toString(), null);
//
//        }
//        User teacher=uService.getById(UUID.fromString(teacherId));
//        if (teacher==null){
//            return new ApiResult(false,Messages.WRONG_ID.toString(), null);
//        }
//        Course course=new Course();
//        course.setTeacher(teacher);
//        course.setOpen(open);
//        course.setCover(cover);
//        course.setName(name);
//        course.setDescription(desc);
//        return new ApiResult(true,"添加成功",VmCourse.create(service.add(course),true));
        return addOrUpdate(null, info);
    }

    public ApiResult addOrUpdate(UUID id,CourseInfo info ){
        String token=info.getToken();
        String name=info.getName();
        String desc=info.getDesc();
        String cover=info.getCover();
        String teacherId=info.getTid();
        boolean open=info.isOpen();
        if (StringUtils.isEmpty(name)||
                StringUtils.isEmpty(desc)||
                StringUtils.isEmpty(cover)||
                StringUtils.isEmpty(teacherId)){
            return new ApiResult(false, Messages.INCOMPLETE_INFO.toString(), null);

        }
        User teacher=uService.getById(UUID.fromString(teacherId));
        if (teacher==null){
            return new ApiResult(false,Messages.WRONG_ID.toString(), null);
        }
        Course course;
        boolean create=id==null;
        if (create){
            course=new Course();
            course.setTeacher(teacher);
        }else {
            course=service.getById(id);
            if (course==null){
                return new ApiResult(false,Messages.WRONG_ID.toString(), null);
            }
        }
        course.setOpen(open);
        course.setCover(cover);
        course.setName(name);
        course.setDescription(desc);
        if (create){
            return new ApiResult(true,"添加成功",VmCourse.create(service.add(course),true));
        }else {
        Course updated = service.update(course, token);
        if (updated == null) {
            return new ApiResult(false, Messages.NO_PERMISSION.toString(), null);
        }
        return new ApiResult(true, "更新成功", VmCourse.create(updated, true));
    }
    }
    @PostMapping(ApiConstant.ROUTE_COURSE_UPDATE)
    public ApiResult update(@PathVariable UUID id,@RequestBody CourseInfo info){
//        String token=info.getToken();
//        String name=info.getName();
//        String desc=info.getDesc();
//        String cover=info.getCover();
//        String teacherId=info.getTid();
//        boolean open=info.isOpen();
//        if (StringUtils.isEmpty(name)||
//                StringUtils.isEmpty(desc)||
//                StringUtils.isEmpty(cover)||
//                StringUtils.isEmpty(teacherId)){
//            return new ApiResult(false, Messages.INCOMPLETE_INFO.toString(), null);
//
//        }
//        User teacher=uService.getById(UUID.fromString(teacherId));
//        if (teacher==null){
//            return new ApiResult(false,Messages.WRONG_ID.toString(), null);
//        }
//        Course course=service.getById(id);
//        if (course==null){
//            return new ApiResult(false,Messages.WRONG_ID.toString(), null);
//        }
//        course.setOpen(open);
//        course.setCover(cover);
//        course.setName(name);
//        course.setDescription(desc);
//        Course updated=service.update(course,token);
//        if (updated==null){
//            return new ApiResult(false,Messages.NO_PERMISSION.toString(), null);
//        }
//        return new ApiResult(true,"更新成功",VmCourse.create(updated,true));
        return addOrUpdate(id, info);

    }

    @PostMapping(ApiConstant.ROUTE_COURSE_OPEN_CLOSE)
    public ApiResult openCloseCourse(@RequestBody CourseOpenInfo info){
        String strCourseId=info.getCourseId();
        String token=info.getToken();
        boolean open=info.isOpen();
        if (StringUtils.isEmpty(strCourseId)||StringUtils.isEmpty(token)){
            return new ApiResult(false,Messages.INCOMPLETE_INFO.toString(), null);
        }
        Course course=service.openCloseCourse(UUID.fromString(strCourseId),open,token);
        if (course==null){
            return new ApiResult(false,Messages.WRONG_ID.toString(), null);
        }
        return new ApiResult(true, "操作成功", VmCourse.create(course, true));

    }
    @DeleteMapping(ApiConstant.ROUTE_COURSE_REMOVE)
    public ApiResult delete(@RequestBody CourseKeyInfo info){
        String strCourseId=info.getCourseId();
        String token=info.getToken();
        if (StringUtils.isEmpty(strCourseId)||StringUtils.isEmpty(token)){
            return new ApiResult(false,Messages.INCOMPLETE_INFO.toString(), null);
        }
        Messages msg=service.remove(UUID.fromString(strCourseId),token);
        return new ApiResult(msg==Messages.SUCCESS, msg.toString(), null);
    }

}
